約 4,768,009 件
https://w.atwiki.jp/bambooflow/pages/126.html
Visual C++ 2008 Express EditionへのSystemCライブラリ インストール Windows XPでのVisual C++ 2008 Expres EditionへのSystemCインストールをしてみた。 プロジェクトファイルは(バージョンは違うが)すでに用意されているのでそれを使う。 Visual C++ 2008 Express EditionへのSystemCライブラリ インストールSystemC2.2インストールフォルダ展開 プロジェクトファイル実行 プロジェクトファイルの設定・確認 コンパイル(ビルド) インストール 設定のまとめ SystemC2.2インストール フォルダ展開 C \にsystemc-2.2.0フォルダを展開。 プロジェクトファイル実行 C \systemc-2.2.0\mscv71\SystemCフォルダへ移動して、SystemC.vcprjをダブルクリック。 変換ウィザードが実行されるので、次へをクリック。 変換前にバックアップを作成するで、次へをクリック。 完了をクリック。 閉じるをクリック。 準備完了。 プロジェクトファイルの設定・確認 メニューのプロジェクトからプロパティを選択。 全般、構成の種類が"スタティック ライブラリ(.lib)"であることを確認。 出力ディレクトリ、中間ディレクトリは"Debug"であることを確認。 デバッグ、特に設定無し。 C/C++の全般、追加インクルードディレクトリの設定が"../../src"となっていることを確認。 64ビット移植への対応は"いいえ"であることを確認。 C/C++の最適化、特に設定無し。 最適化は今回、"無効(/Od)"としたが、最適化してもよい。 C/C++のプリプロセッサ、プロセッサの定義で"WIN32;_DEBUG;_LIB;SC_INCLUDE_FX"となっていることを確認。 C/C++のコード生成、簡易リビルドを行うは"いいえ"を選択。 ランタイムライブラリは"マルチスレッド デバッグ(/MTd)"であることを確認。 C/C++の言語、ランタイム型情報を有効にするは"はい"であることを確認。 C/C++のプリコンパイル済みヘッダー、プリコンパイル済みヘッダの作成/使用は"プリコンパイル済みヘッダーを使用しない"であることを確認。 C/C++の出力ファイル、特に設定無し。 C/C++のブラウザ情報、特に設定無し。 C/C++の詳細、指定の警告を無効にするは、"4224;4996"と変更。(しなくてもコンパイルはできるが警告メッセージがうるさい) C/C++のコマンド ライン、設定が正しいかどうか、もう一度確認。 ライブラリアンの全般、出力ファイルが"$(OutDir)/SystemC.lib"となっていることを確認。 コンパイル(ビルド) メニューのビルドからソリューションのビルドを選択して、コンパイル開始。( F7 でもOK) コンパイルが正常に終了したことを確認。 C \systemc-2.2.0\mvc71\SystemC\Debugフォルダ下にSystemC.libが生成されていることを確認。 これで、コンパイル完了。 今回は、とりあえずSystemCが実行できればいいかな程度の設定。 最適化とかはおこのみで。 インストール 設定のまとめ 以下のプロパティ設定を確認する。 全般、構成の種類が"スタティック ライブラリ(.lib)"であることを確認。 出力ディレクトリ、中間ディレクトリは"Debug"であることを確認。 C/C++の全般、追加インクルードディレクトリの設定が"../../src"となっていることを確認。 C/C++のプリプロセッサ、プロセッサの定義で"WIN32;_DEBUG;_LIB;SC_INCLUDE_FX"となっていることを確認。 C/C++のコード生成、簡易リビルドを行うは"いいえ"を選択。 C/C++のコード生成、ランタイムライブラリは"マルチスレッド デバッグ(/MTd)"であることを確認。 C/C++の言語、ランタイム型情報を有効にするは"はい"であることを確認。 C/C++の詳細、指定の警告を無効にするは、"4224;4996"と変更。(しなくてもコンパイルはできるが警告メッセージがうるさい) ライブラリアンの全般、出力ファイルが"$(OutDir)/SystemC.lib"となっていることを確認。 テストプログラム、HelloWorldのコンパイル・実行へ
https://w.atwiki.jp/systemc/pages/15.html
systemc-amsのインストール SystemC-amsには、1.0.1と2.0 Betaがある。Fraunhoferのホームページでダウンロードできる。 g++-4.9でコンパイルするにあたって、特にソースコードを編集する必要はない。SystemC-2.3.1との組み合わせで問題なく動作する。 64ビットCPU上のcygwinで使用する場合は、SystemC-2.3.1のインストール時にアーキテクチャをcygwin64と認識するのに対し、amsのcygwinへのインストールでは32ビットと64ビットを区別しないので、下記の修正をconfigure.acに行うと良い。 TARGET_ARCH="cygwin" EXTRA_CXXFLAGS="-I$SYSC_INC_PREFIX" と書かれている行を case "$target_cpu" in x86_64 | amd64) TARGET_ARCH="cygwin64" EXTRA_CXXFLAGS="-I$SYSC_INC_PREFIX -m64" ;; i*86) TARGET_ARCH="cygwin" EXTRA_CXXFLAGS="-I$SYSC_INC_PREFIX" ;; *) AC_MSG_ERROR("sorry... compiler not supported.") ;; esac に置き換える。 (2012年の記述) Fraunhoferのホームページからダウンロードしてきたsystemc-ams-1.0BETA2.tgzを展開する。 tar xvfz systemc-ams-1.0BETA2.tgz 展開されたsystemc-ams-1.0BETA1ディレクトリへ移動する。 cd systemc-ams-1.0BETA2 自分の環境に合わせて環境変数を設定する。 export SYSTEMC_HOME=/usr/local/systemc-2.2 g++-4.3を使用する場合は、configure.acファイルの中の EXTRA_CXXFLAGS="-I$SYSC_INC_PREFIX" と書かれたすべての行あるいは自分の使用するターゲットの行を EXTRA_CXXFLAGS="-isystem $SYSC_INC_PREFIX" に置き換える。 コンパイル環境を構築する。 ./configure コンパイルを行う。 make ライブラリを作成する。 make install 2015-05-06 20 40 19 (Wed) -
https://w.atwiki.jp/bambooflow/pages/169.html
インドのCircuitSutra、STARC「TLモデリングガイド」準拠のデモモデルをWebで公開、したらしい -- (管理者) 2009-04-23 06 46 46 OSCI TLM 2.0のSystemC TLMキットを米OCP-IPが提供開始、らしい -- (管理者) 2009-05-05 08 40 52 OSCI本家に”TLM-2.0 in Action”がアップされた。 -- (管理者) 2009-05-07 23 46 46 Cadence IES8.2がTLM2.0に対応。 -- (管理者) 2009-05-28 07 16 19 SystemC Japan 2009は2009年7月10日。 -- (管理者) 2009-05-28 07 17 30
https://w.atwiki.jp/systemc/pages/13.html
トップページ メニュー systemc_install systemc_begin TLM_install ams_install SystemC-AMS紹介 SystemCと高位合成 c++研究 暫定メニュー リンク @wiki @wikiご利用ガイド ここを編集
https://w.atwiki.jp/bambooflow/pages/111.html
SystemCの基本データタイプ SystemCの基本データタイプ基本データタイプ一覧 キャスト(データタイプの変換) 変換一覧(to_xxx)to_stringの使い方 coutで表示させたい場合 printfで表示させたい場合 sc_stringがない? SystemCでは、標準C++のデータ型に加えて以下のようなデータ型が扱える。 基本データタイプ一覧 データタイプ 符号 説明 使用例 sc_int<W> 付 Wビット整数 sc_int 16 a = -123; sc_uint<W> 無 sc_uint 32 addr = 0xdeadbeaf; sc_bigint<W> 付 Wが64ビット以上の整数 sc_biguint<W> 無 sc_bit - 0 , 1 の2値 sc_bit b = 1 ; sc_logic - 0 , 1 , x , z の4値 sc_bit l = x ; sc_bv<W> - sc_bitのWビットベクタ sc_bv 8 bv = "10110110"; sc_lv<W> - sc_logicのWビットベクタ sc_lv 8 lv = "xxxx1010"; sc_fixed<NW, NI> 付 固定小数点NW=全サイズ、NI=整数サイズ sc_fixed 8,4 f = -1.25; sc_ufixed<NW, NI> 無 sc_ufixed 8,4 f = 1.5; 他にもあるが、基本はこんなもの。 C++では、8、16、32、64といったサイズしか扱うことはできない。 SystemCではハードウェアを意識した記述も書けるようにビットサイズが可変であるデータ型が準備されている。 また、sc_logic、sc_lv といった4値を扱うことができるデータ型もある。ただし4値を扱うとシミュレーション速度は低速になる。 SystemCの主な利用価値は、ソフトウェアとの強調検証となっている。そのため、速度が低下する4値は扱うことはほとんどない。 高位合成でも、4値は使用せずにsc_int 、sc_uint がほとんどになる。 sc_fixed ,sc_fixed の高速版であるsc_fixed_fast ,sc_ufixed_fast もある。 キャスト(データタイプの変換) sc_uint 16 x; sc_int 32 y; y = (sc_uint 32 )x; // C++のキャストと同じ 変換一覧(to_xxx) 基本データタイプに共通。 戻り値 関数 int to_int() unsigned int to_uint() long to_long() unsigned long to_ulong() int64 to_int64() uint64 to_uint64() double to_double() const std string to_string() to_stringの使い方 書式 const std string to_string (sc_numrep numrep) const sc_numrep列挙 説明 例(sc_int 8 100) 例(sc_int 8 -100) SC_NOBASE = 0 そのまま "100" "-100" SC_BIN = 2 2進数 "0b01100100" "0b10011100" SC_OCT = 8 8進数 "0o144" "0o634" SC_DEC = 10 10進数 "100" "-100" SC_HEX = 16 16進数 "0x64" "0x9c" SC_BIN_US 2進数(2の補数) "0bus1100100" "negative" SC_BIN_SM 符号付2進数 "0bsm01100100" "-0bsm01100100" SC_OCT_US 8進数(2の補数) "0ous144" "negative" SC_OCT_SM 符号付8進数 "0osm144" "-0osm144" SC_HEX_US 16進数(2の補数) "0xus64" "negative" SC_HEX_SM 符号付16進数 "0xsm64" "-0xsm64" SC_CSD 正規化符号付数字 "0csd10-00100" "0csd-0100-00" coutで表示させたい場合 2進数で代入したい場合。 普通Cでは、2進数は表示できないがSystemCならば表示できたりする。 sc_int 8 data = "0b01010011"; cout "data = " data.to_string(SC_HEX) endl; "0b"の後に"0"を付けると正数、"1"を付けると負数となる。 sc_int 8 data = 100; cout data endl; // 通常表示 cout data.to_string( SC_HEX ) endl; // 16進数 printfで表示させたい場合 SystemCのデータ型を表示するときの方法。 sc_int 32 data; printf( "data = %d\n", (int)data ); // キャスト printf( "data = %d\n", data.to_int() ); // int型に変換 次の方法はダメ。 printf( "data = %d\n", data ); // セグメンテーションエラー 以下のような警告が出る。 test.cpp function 内の `int sc_main(int, char**) test.cpp 9 警告 cannot pass objects of non-POD type `class sc_dt sc_int 32 through `... ; call will abort at runtime ただし、コンパイルは通る。 通るが、実行すると"セグメンテーションエラー"となる。 sc_stringがない? SystemCのバージョン2.2ではsc_stringがなくなっている。 とりあえず、以下のようにすればよいかも。 typedef sc_string std string;
https://w.atwiki.jp/bambooflow/pages/66.html
リセット動作 SystemC v2.1では、リセット動作を記述できるプロセスは、SC_METHODとSC_CTHREADだけ。 SC_THREADでのリセット動作の実現はやってやれないこともないと思うが、現状難しいと思う。 でも、のちのちのヴァージョンではSC_CTHREADは廃止されてSC_THREADでリセット動作も可能になるかも。 SC_METHODでのリセット動作 カウンタ クロック数をカウントする。 入力はクロック信号、リセット信号で、出力はカウンタ数である。 入力reset_xがfalseのとき、内部カウンタctrは0にクリアされる。 入力reset_xがtrueのとき、内部カウンタはクロックの立ち上がりでインクリメントされる。 #include systemc.h SC_MODULE(COUNTER) { sc_in_clk clk; sc_in bool reset_x; sc_out int ctr; void process() { if (!reset_x) { ctr = 0; } else { ctr++; } } SC_CTOR(COUNTER) { SC_METHOD(process); sensitive clk.pos(); } };
https://w.atwiki.jp/systemc/pages/2.html
トップページ メニュー systemc_install systemc_begin TLM_install ams_install SystemC-AMS紹介 SystemCと高位合成 c++研究 暫定メニュー リンク @wiki @wikiご利用ガイド ここを編集
https://w.atwiki.jp/bambooflow/pages/170.html
SystemCでユーザデータタイプを使うユーザデータタイプを使うときの問題 ユーザデータタイプを使うための解決 bool operator==()はなぜ必要? テンプレートを使用したユーザデータタイプの場合 SystemCでユーザデータタイプを使う sc_signal やsc_buffer を介したデータやりとりは、既に定義されたbool,int,sc_int 等は問題なく使うことができます。 しかし、ユーザが独自に構造体を定義して、それを受渡しする場合問題が生じる。 ここでは、sc_signal もしくはsc_buffer でユーザデータタイプを使用する方法をメモします。 ユーザデータタイプを使うときの問題 次のコードを見てください。 struct StrData { bool valid; int data; }; int sc_main( int, char** ) { sc_signal StrData sig; } 上記をコンパイルしようとすると、次のようなエラーが発生します。 /usr/local/systemc-2.2.0/include/sysc/communication/sc_signal.h In member function ‘void sc_core sc_signal IF write(const T ) [with T = StrData]’ main.cpp 119 instantiated from here /usr/local/systemc-2.2.0/include/sysc/communication/sc_signal.h 221 error no match for ‘operator==’ in ‘((sc_core sc_signal StrData *)this)- sc_core sc_signal StrData m_new_val == ((sc_core sc_signal StrData *)this)- sc_core sc_signal StrData m_cur_val’ ・・・ ・・・ はじめなんじゃこりゃってなりますが、‘operator==’がどうやら足りないというメッセージのようです。 なにか工夫をしないといけないようです。 ユーザデータタイプを使うための解決 ユーザデータタイプをsc_signal<>やsc_buffer<>で使う場合は、次の3つを定義してあげます。 bool operator==() sc_trace() ostream operator () 具体的には、次のように修正します。 struct StrData { bool valid; int data; // sc_signal で使う bool operator==(const StrData other) const { return ( (valid == other.valid) (data == other.data) ); } }; // トレース時使用する void sc_trace( sc_trace_file* tf, const StrData trans, std string name ) { sc_trace( tf, trans.valid, name + ".valid" ); sc_trace( tf, trans.data, name + ".data" ); } // SystemCで使う ostream operator ( ostream os, const StrData trans ) { os "(" trans.valid ", " trans.data ")"; return os; } int sc_main( int, char** ) { sc_signal StrData sig; } 構造体1つを扱うのにこれだけ定義が増えるのはちょっと面倒臭いですが、これもSystemCの仕様なのでしかたないです。 ここで、operator==はちゃんと書かないとダメですが、sc_trace()とoperator ()の関数の中身は、ないと不便なだけで書かなくてもコンパイルできます。 面倒臭いときは、わたしは省略しちゃいます。 bool operator==()はなぜ必要? 次のコードを見てください。 SC_MODULE(MOD) { sc_in StrData din; SC_CTOR(MOD) { SC_METHOD( method ); sensitive din; // dinが変化したとき } void method() { std cout "din = " din.read() std endl; } }; メソッドであるmethod()がよばれるのは、sensitive dinよりdinが変化したときであるとわかります。 「変化した」というのをSystemCではどうやって判断しているかというと内部で"=="で比較しています。なので"=="で比較できるというのが前提でSystemCが設計されているので、ないとコンパイル時に"operator==が無い"と怒られるわけです。 SystemCデータタイプであるsc_int やsc_fixed はちゃんとoperator==が定義されているので、そんなことは気にしなくても使えます。 テンプレートを使用したユーザデータタイプの場合 次のようなテンプレートを使ったデータタイプを見てみます。 template typename DT, int N struct Payload { bool w_flag; int address; DT data[N]; }; 次のように修正します。 template typename DT, int N struct Payload { bool w_flag; int address; DT data[N]; // sc_signal で必要 template typename ODT,int ON bool operator==( const Payload ODT,ON other) const { bool ret; ret = (w_flag == other.w_flag) (address == other.address); for (int i=0; i N; i++) ret = ret (data[i] == other.data[i]); return ret; } }; // トレースで必要 template typename DT, int N void sc_trace( sc_trace_file* tf, const Payload DT,N trans, std string name ) { sc_trace( tf, trans.w_flag, name + ".w_flag" ); sc_trace( tf, trans.address, name + ".address" ); for (int i=0; i N; i++) { std ostringstream oss; oss name ".data_" i; sc_trace( tf, trans.address, oss.str() ); } } // SystemCで必要 template typename DT, int N ostream operator ( ostream os, const Payload DT,N trans ) { os "(" trans.w_flag ", " trans.address ", "; for (int i=0; i N; i++) os (int)trans.data[i] ", "; os ")"; return os; }
https://w.atwiki.jp/bambooflow/pages/141.html
C++標準テンプレートライブラリSTLの利用 C++標準テンプレートライブラリSTLの利用STLとは STLの構成 コンテナの種類 vector の利用vectorへのおもなアクセス メモリとしてのvectorの利用例 STLとは STL Standard Template Library C++のテンプレート機能を最大限に利用した標準ライブラリ。 STLは簡単にいうと配列のような要素の集合(コンテナ)を扱いやすくしたもの。 たとえば、動的な配列の確保を繰り返したり、ソートしたり、FIFOの構成を作ったり、連想配列を構成したりがSTLを使うことで容易になる。また、速度も早い。 現在すべてのC++のコンパイラで提供されている。 SystemCはVerilog-HDLと違って、C++で記述できるものは制限なく使うことができるのが利点。なので、活用できる便利な機能は存分に使うべし。 STLの構成 次のもので構成されている。 コンテナ 共通アルゴリズム イテレータ 関数オブジェクト ここでは、最低限使えればとりあえずよしとし、あまり詳しく説明しない。 もし、興味があるようであれば、別のサイトを参照のこと。 コンテナの種類 代表的なものは以下のとおり。 コンテナ 説明 vector 動的配列、ランダムアクセスが可能、Cの配列と互換がある deque 動的配列、両端キュー map 連想配列、バイナリツリーに要素を持ちソートされた状態で取り出せる list 双方向リンクドリスト、要素の入れ換えが得意 vector の利用 vectorは動的配列。 ランダムアクセスに向いているが、要素の追加・削除は要素数に比例して時間がかかる。 配列の代わりに使用するとよい。 vectorコンテナを利用するには次をインクルードする必要がある。 #include vector 必要なら次のおまじないをかく。 using namespace std; もし、ネームスペースがわかる人であれば、いちいちstd を書くことをすすめる。 vectorへのおもなアクセス 以下は全てではないが、よく使いそうなものを挙げた。 メソッド・書式 説明 iterator begin() 先頭を表すイタレータを返す iterator end() 末尾を表すイタレータを返す bool empty() vectorの要素が空なら"true"、空でなければ"false"を返す int size() 要素数を返す void clear() すべての要素を削除 reference at( size_type pos ) pos番目の要素を返す reference operator[]( size_type pos ) pos番目の要素を返す。「at」を使用することを推奨) void assign( const iterator first, const iterator last ) vectorの内容をfirstからlastに置き換え void assign( size_type n, const T x = T() ) vectorの内容をn個のxに置き換え void swap( vector x ) vectorの内容をxと交換 void resize(size_type new_size, T x = T()) 大きさを変える。必要なら領域を拡張し、拡張分はxで初期化される コンストラクタ 書式 説明(例) vector(); 例) vector int vect;長さ0のint型のvectorを作る vector( size_type size ); 例) vector int vect2(20);長さ20のint型vectorを作る vector( size_type size, const TYPE val ); 例) vector int vect3(10, 100);長さ10のint型vectorを作り、すべての要素を100で初期化する vector( const vector from ); 例) vector int vect4(vect1);vect1をコピーし、vect4とする メモリとしてのvectorの利用例 std vector unsigned int mem( 1024, 0 ); // RAM、1024個用意し、すべて0で初期化 // Write mem.at(addr) = w_data; // mem[addr] = w_data; でもOK // Read mem[addr] = mem.at(addr); // r_data = mem[addr]; でもOK
https://w.atwiki.jp/bambooflow/pages/166.html
SystemCのレポート処理 SystemCのレポート処理レポート使いかた1ー簡単な例 レポート使いかた2ー練習用すべてのメッセージを画面出力させたくないとき リファレンスsc_report_handlersc_actions sc_report メッセージの分類(レベル)一覧 メッセージ動作一覧デフォルトの動作 メッセージ表示用マクロ その他 SystemCのV2.1からレポート出力処理を簡単に制御するためのエラーレポートシステムが標準化されています。 エラーメッセージやトラッキングレポートなど発生元の特定し、デバッグを容易にすることは不可欠です。 メッセージには、Information、Warning、Error、Fatalの4つの種類があるようです。 この4つのメッセージについて出力方法を指定したり、動作を指定したりすることができます。 画面出力やログ出力を簡単に切り替えることができます。 簡単にメモ書きを残します。 レポート使いかた1ー簡単な例 以下に簡単な例を紹介。 サンプル #include systemc.h const char* sim_name = "test"; // メッセージID名 int sc_main( int argc, char* argv[] ) { sc_report_handler set_log_file_name("sample_run.log"); // ログファイル設定 sc_report_handler stop_after( SC_ERROR, 100 ); // シミュレーション終了指定 sc_report_handler set_actions( sim_name, SC_INFO, SC_DISPLAY | SC_LOG ); // 動作指定 SC_REPORT_INFO( sim_name, "sample report1" ); sc_start( 100, SC_NS ); SC_REPORT_INFO( sim_name, "sample report2" ); return 0; } set_log_file_nameはメッセージを出力するレポートファイル名を指定します。 どこで、そのメッセージが出力されているかのグループ分けのために使用します。 とりあえずはファイル名やモジュール名等を指定するとよいかもしれません。 stop_afterはレポート情報の回数からシミュレーションを停止するタイミングを指定することができます。stop_after( SC_ERROR, 100 )は「ERROR(エラー)」レベルのメッセージの数(SC_REPORT_ERRORの実行回数)が100回となったらシミュレーションを停止させます。ゼロに設定するとdisableです。 今回のサンプルでは意味ないです。 set_actionsはメッセージ処理に対する動作を設定することができます。et_actions( sim_name, SC_INFO, SC_DISPLAY | SC_LOG )は、「INFO(情報)」レベルのメッセージを画面出力とファイル出力に設定しています。 画面表示 Info test sample report1 Info test sample report2 標準出力(std cout)にレポートを出力するにはset_actionsでSC_DISPLAYを設定します。 レポートファイル出力(sample_run.log) 0 s Info test sample report2 100 ns Info test sample report2 ファイルに出力するには、set_log_file_nameにて出力ファイル名を設定して、かつ、set_actionsにてSC_LOGを設定します。 ファイルへの出力には経過時間も記録されるみたいです。 デフォルトの動作はすべてのメッセージレベルはログ出力となっているので、ログファイル指定するだけで出力されるはずです。 レポート使いかた2ー練習用 いろいろ試してみました。 以下にサンプルコードを載せます。実際に使うときはもっときれいに書きたいものです。 このサンプルは、レポート処理の動作を見るために作ったものです。 モジュールはMOD1とMOD2があります。 モジュールはそれぞれスレッドを持っていて、定期的にメッセージを出力させています。 メッセージの制御は、sc_mainで行います。 はじめの状態は、単にデフォルト設定のままで、ログファイル("sample_run.log")出力するだけです。 コメントアウトされているsc_actionsやsc_stop_afterを有効にすることでメッセージ制御が行えます。 サンプルコード(sample_report02.cpp) #include systemc.h const char* id_name1 = "ID_1"; const char* id_name2 = "ID_2"; SC_MODULE( MOD1 ) { SC_CTOR( MOD1 ) { SC_THREAD( thread ); } void thread() { int cnt = 0; while (true) { ++cnt; wait( 10, SC_NS ); if (cnt%80==0) SC_REPORT_FATAL( id_name1, "sample Fatal1" ); else if (cnt%50==0) SC_REPORT_ERROR( id_name1, "sample Error1" ); else if (cnt%30==0) SC_REPORT_WARNING( id_name1, "sample Warning1" ); else if (cnt%10==0) SC_REPORT_INFO( id_name1, "sample Info1" ); } } }; SC_MODULE( MOD2 ) { SC_CTOR( MOD2 ) { SC_THREAD( thread ); } void thread() { int cnt = 0; while (true) { ++cnt; wait( 15, SC_NS ); if (cnt%100==0) SC_REPORT_FATAL( id_name2, "sample Fatal1" ); else if (cnt%70==0) SC_REPORT_ERROR( id_name2, "sample Error1" ); else if (cnt%40==0) SC_REPORT_WARNING( id_name2, "sample Warning1" ); else if (cnt%20==0) SC_REPORT_INFO( id_name2, "sample Info1" ); } } }; int sc_main( int argc, char* argv[] ) { MOD1 mod1("mod1"); MOD2 mod2("mod2"); // 以下、メッセージの制御 sc_report_handler set_log_file_name("sample_run.log"); //sc_report_handler set_actions( SC_ERROR, SC_DISPLAY | SC_LOG | SC_CACHE_REPORT ); //sc_report_handler set_actions( SC_FATAL, SC_DISPLAY | SC_LOG | SC_CACHE_REPORT ); //sc_report_handler suppress( SC_THROW ); //sc_report_handler stop_after( SC_FATAL, 10 ); //sc_report_handler set_actions( SC_INFO, SC_DISPLAY | SC_LOG ); //sc_report_handler stop_after( SC_FATAL, 10 ); //sc_report_handler stop_after( SC_ERROR, 10 ); //sc_report_handler set_actions( id_name1, SC_WARNING, SC_LOG | SC_CACHE_REPORT ); // シミュレーション実行 sc_start( 1., SC_MS ); // シミュレーション終了後の処理 cout endl; cout " ****** end-time = " sc_time_stamp() " ******" endl; cout endl; sc_report *rp = sc_report_handler get_cached_report(); if (rp) { cout "--- Cache Messgage ---" endl; cout rp- get_msg() endl; cout "--- Cache Messgage end ---" endl; } cout endl; cout "--- " id_name1 " ---" endl; cout " Info count = " sc_report_handler get_count( id_name1, SC_INFO ) endl; cout " Warning count = " sc_report_handler get_count( id_name1, SC_WARNING ) endl; cout " Error count = " sc_report_handler get_count( id_name1, SC_ERROR ) endl; cout " Fatal count = " sc_report_handler get_count( id_name1, SC_FATAL ) endl; cout "--- " id_name2 " ---" endl; cout " Info count = " sc_report_handler get_count( id_name2, SC_INFO ) endl; cout " Warning count = " sc_report_handler get_count( id_name2, SC_WARNING ) endl; cout " Error count = " sc_report_handler get_count( id_name2, SC_ERROR ) endl; cout " Fatal count = " sc_report_handler get_count( id_name2, SC_FATAL ) endl; cout "--- TOTAL ---" endl; cout " Info count = " sc_report_handler get_count( SC_INFO ) endl; cout " Warning count = " sc_report_handler get_count( SC_WARNING ) endl; cout " Error count = " sc_report_handler get_count( SC_ERROR ) endl; cout " Fatal count = " sc_report_handler get_count( SC_FATAL ) endl; return 0; } 画面出力例 ・・・ Error ID_1 sample Error1 In file report_sample02.cpp 15 In process mod1.thread @ 500 ns ****** end-time = 500 ns ****** --- Cache Messgage --- sample Error1 --- Cache Messgage end --- --- ID_1 --- Info count = 3 Warning count = 1 Error count = 1 Fatal count = 0 --- ID_2 --- Info count = 1 Warning count = 0 Error count = 0 Fatal count = 0 --- TOTAL --- Info count = 4 Warning count = 1 Error count = 1 Fatal count = 0 デフォルトのレポートの動作では、エラーメッセージが表示されると、throwへとばされて、シミュレーションが終了してしまいます。 通常ならば、エラーが出力された時点でシミュレーションが止まっても問題ないと思いますが、継続して実行したい場合もあります。 その時は、以下のような設定をします。 sc_report_handler set_actions( SC_ERROR, SC_DISPLAY | SC_LOG | SC_CACHE_REPORT ); // SC_THROWをはずす SC_ERRORの動作をデフォルト設定から上書きします。 ためしに設定を有効にして実行してみます。 実行結果 ・・・ Fatal ID_1 sample Fatal1 In file report_sample02.cpp 15 In process mod1.thread @ 800 ns アボートしました 今度は、Fatalメッセージが出力されると同時に、アボートしてしまいました。 これは、Fatalのデフォルト設定にSC_ABORTが設定されているためです。 先ほどのERROR同様に、SC_ABORTをはずして設定を上書きすれば止まらなくなります。 sc_report_handler set_actions( SC_ERROR, SC_DISPLAY | SC_LOG | SC_CACHE_REPORT ); // SC_ABORTをはずす 設定して、実行するとシミュレーションは1ms(sc_startに設定した時間)経過して止まると思います。 今度は、FATALメッセージが10回表示されたら、シミュレーションを終了するようにします。 設定は以下を追加します。 sc_report_handler stop_after( SC_FATAL, 10 ); 設定して実行すると、TOTALのFatal count値が10でシミュレーションが終了すると思います。 stop_afterは、IDを指定することもできます。 sc_report_handler stop_after( id_name2, SC_FATAL, 10 ); // id_name2="ID_2" 上記の設定にして実行すると、ID_2のFATALメッセージが10回表示された時点でシミュレーションが終了すると思います。 すべてのメッセージを画面出力させたくないとき すべてのメッセージを画面出力させたくないときは、以下を設定します。 sc_report_handler suppress( SC_DISPLAY ); 解除するときは、suppress()を実行すればよいようです。 逆に強制的に画面出力させるときは、force( SC_DISPLAY )とすればよいようです。 リファレンス sc_report_handler 次を参照してください。 sc_report_handler sc_actions メッセージに対して動作を指定することができます。 static sc_actions set_actions( sc_severity, sc_actions = SC_UNSPECIFIED ); メッセージレベルごとに動作を指定します。 static sc_actions set_actions( const char* msg_type, sc_actions = SC_UNSPECIFIED ); IDごとに動作を指定します。 static sc_actions set_actions( const char* msg_type, sc_severity, sc_actions = SC_UNSPECIFIED ); メッセージレベルとIDごとに動作を指定します。 sc_report 次を参照してください。 sc_report メッセージの分類(レベル)一覧 メッセージには以下のような種類があります。 sc_severity SC_INFO 情報出力 SC_WARNING 警告、問題かもしれないことを知らせる SC_ERROR 重大な問題 SC_FATAL 致命的な問題、デフォルトではシミュレーションを終了 メッセージ動作一覧 メッセージのレベルごとに動作を指定することができます。 enum SC_UNSPECIFIED SC_DO_NOTHING 何もしない SC_THROW レポートとの内容に対応するC++の例外を発生。 SC_LOG レポートをログに出力する。通常はディスク上のファイルへ出力。 SC_DISPLAY レポートを画面出。 SC_INTERRUPT シミュレーションを一時停止。sc_interrupt_hereをよぶ。 SC_CACHE_REPORT レポートのコピーを保存。get_cached_repot()より後に取得できる。 SC_STOP sc_stop()をよぶ。 SC_ABORT sc_abort()をよぶ。 デフォルトの動作 デフォルトの動作は次のように設定されているようです。 SC_DEFAULT_INFO_ACTIONS (SC_LOG | SC_DISPLAY) SC_DEFAULT_WARNING_ACTIONS (SC_LOG | SC_DISPLAY) SC_DEFAULT_ERROR_ACTIONS (SC_LOG | SC_CACHE_REPORT | SC_THROW) SC_DEFAULT_FATAL_ACTIONS (SC_LOG | SC_DISPLAY | SC_CACHE_REPORT | SC_ABORT) 全てのメッセージは(ログファイル名が設定されていれば)ファイル出力します。 FATAL時、シミュレーションはアボートします。 メッセージ表示用マクロ SC_REPORT_INFO(id,msg) 情報メッセージに使用 SC_REPORT_WARNING(id,msg) ワーニングメッセージに使用 SC_REPORT_ERROR(id,msg) エラーメッセージに使用 SC_REPORT_FATAL(id,msg) 致命的エラーメッセージに使用 sc_assert(expr) アサート、assertのかわりに使用 sc_assertは以下のようにdefine定義されています。 #define sc_assert(expr) \ ((void) ((expr) ? 0 (SC_REPORT_FATAL( SC_ID_ASSERTION_FAILED_ , #expr ), 0))) その他 SystemCのログファイルからVCDファイルを生成するツールを作ってみました。 てきとうなので、うまくうごかなかったらごめんなさい。 sysclog2vcd.pl 使いかた % ./sysclog2vcd.pl ログファイル名 % gtkwave sysclog.vcd 以上